package org.mx.dal.config;

import javax.sql.DataSource;

import org.mx.dbcp.Dbcp2DataSourceFactory;
import org.mx.dbcp.MyDbcp2DataSourceFactoryUtil;
import org.mx.i8n.DsdbI18nMessageResourceCreator;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * 基于Spring JDBC的DAL基础实现
 *
 * @author : john.peng date : 2021/7/12
 * @see DalConfig
 */
@Import(DalConfig.class)
public class DalRdbConfig {
	/**
	 * 根据配置创建数据库连接池工厂集合，支持多数据库连接。
	 * @param env Spring IoC 环境
	 * @param context Spring IoC上下文
	 * @return 数据库连接池工厂集合，可以根据配置名访问
	 */
	@Bean("myDbcp2DataSourceFactoryUtil")
	public MyDbcp2DataSourceFactoryUtil dbcp2DataSourceFactories(Environment env, ApplicationContext context) {
		return new MyDbcp2DataSourceFactoryUtil(env, context);
	}

	/**
	 * 创建JDBC数据源工厂
	 *
	 * @param myFactoryUtil 数据库连接池工厂集合对象
	 * @return DBCP数据源工厂
	 */
	@Bean(name = "dataSourceFactory")
	public Dbcp2DataSourceFactory dataSourceFactory(
			@Qualifier("myDbcp2DataSourceFactoryUtil") MyDbcp2DataSourceFactoryUtil myFactoryUtil) {
		return myFactoryUtil.getDataSourceFactory("db");
	}

	/**
	 * 从工厂中获取JDBC数据源
	 *
	 * @param dataSourceFactory DBCP2数据库连接池
	 * @return 数据源
	 */
	@Bean(name = "dataSource")
	public DataSource dataSource(Dbcp2DataSourceFactory dataSourceFactory) {
		return dataSourceFactory.getDataSource();
	}

	/**
	 * 基于DataSource构建出Hibernate JdbcTemplate
	 *
	 * @param dataSource 数据源
	 * @return JdbcTemplate
	 */
	@Bean(name = "jdbcTemplate")
	public JdbcTemplate jdbcTemplate(DataSource dataSource) {
		return new JdbcTemplate(dataSource);
	}

	/**
	 * 创建一个DS自定义的基于数据库表的消息资源包创建器
	 *
	 * @param env          Spring IoC容器上下文环境
	 * @param jdbcTemplate Spring JDBC Template
	 * @return DS自定义的基于数据库表的消息资源包创建器
	 */
	@Bean("dsdbI18nMessageResourceCreator")
	public DsdbI18nMessageResourceCreator dsdbI18nMessageResourceCreator(Environment env, JdbcTemplate jdbcTemplate) {
		return new DsdbI18nMessageResourceCreator(env, jdbcTemplate);
	}
}
